from datetime import date, datetime, timezone, timedelta
import random
import string
from dateutil.relativedelta import relativedelta
import cv2
import threading
from PIL import Image
import numpy as np
import hashlib
from django.conf import settings
from app01 import models


def count_birth(birthday):
    today = date.today()

    diff = relativedelta(today, birthday)
    return diff.years


def count_date_period(date_time_):
    tz = timezone(timedelta(hours=+8))
    now = datetime.now(tz)
    diff = relativedelta(now, date_time_)
    return diff


def today_date():
    return datetime.now().strftime("%Y-%m-%d %H:%M")


# def gen_display_compressed(camera):
#     """
#     视频流生成器功能。
#     """
#     while True:
#         # 读取图片
#         ret, frame = camera.read()
#         if ret:
#             frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
#             # 将图片进行解码
#             ret, frame = cv2.imencode('.jpeg', frame)
#             if ret:
#                 # 转换为byte类型的，存储在迭代器中
#                 yield (b'--frame\r\n'
#                        b'Content-Type: image/jpeg\r\n\r\n' + frame.tobytes() + b'\r\n')
#
#
# def gen_display_original(camera):
#     """
#     视频流生成器功能。
#     """
#     while True:
#         # 读取图片
#         ret, frame = camera.read()
#         if ret:
#             # 将图片进行解码
#             ret, frame = cv2.imencode('.jpeg', frame)
#             if ret:
#                 # 转换为byte类型的，存储在迭代器中
#                 yield (b'--frame\r\n'
#                        b'Content-Type: image/jpeg\r\n\r\n' + frame.tobytes() + b'\r\n')


def image_enhance(image, lightness, saturation):
    """
    用于修改图片的亮度和饱和度
    :param image: 图片对象
    :param lightness: 亮度
    :param saturation: 饱和度
    """
    MAX_VALUE = 50

    # 颜色空间转换 BGR转为HLS
    hlsImg = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)

    # 1.调整亮度（线性变换)
    hlsImg[:, :, 1] = (1.0 + (lightness - 50) / float(MAX_VALUE)) * hlsImg[:, :, 1]
    hlsImg[:, :, 1][hlsImg[:, :, 1] > 1] = 1
    # 饱和度
    hlsImg[:, :, 2] = (1.0 + saturation / float(MAX_VALUE)) * hlsImg[:, :, 2]
    hlsImg[:, :, 2][hlsImg[:, :, 2] > 1] = 1
    # HLS2BGR
    lsImg = cv2.cvtColor(hlsImg, cv2.COLOR_HLS2BGR) * 255
    lsImg = lsImg.astype(np.uint8)
    return lsImg


class VideoCamera(object):
    def __init__(self):
        self.video = cv2.VideoCapture(0 + cv2.CAP_DSHOW)
        (self.grabbed, self.frame) = self.video.read()
        threading.Thread(target=self.update, args=()).start()

    def __del__(self):
        self.video.release()
        del self

    def get_frame(self, lt=50, st=20):
        image = self.frame.astype(np.float32) / 255.0
        self.image = image_enhance(image, int(lt), int(st))
        _, jpeg = cv2.imencode('.jpg', self.image)
        return jpeg.tobytes()

    def update(self):
        while True:
            (self.grabbed, self.frame) = self.video.read()

    def cap_image(self):
        cv2image = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)

        image = Image.fromarray(cv2image)
        return image


def gen(camera, lt=50, st=20):
    while True:
        frame = camera.get_frame(lt, st)
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')


def random_file_name():
    return ''.join(
        random.sample(string.ascii_letters + string.digits, 8))


def md5(data_string):
    obj = hashlib.md5(settings.SECRET_KEY.encode("utf-8"))
    obj.update(data_string.encode("utf-8"))
    return obj.hexdigest()


def record_working(use_id, id_kind, working_kind, description):
    """
        (1, "记录新客户"),
        (2, "记录新进店记录"),
        (3, "生成鼻道镜报告"),
        (4, "更新鼻道镜报告"),
        (5, "达成新订单"),
    """
    wording_data = id_kind
    wording_data["create_time"] = datetime.now().strftime("%Y-%m-%d %H:%M")
    wording_data["user_id"] = use_id
    wording_data["description"] = description
    wording_data["working_kind"] = working_kind

    models.WorkingList.objects.create(**wording_data)


def sayings():
    expressions = [
        "盛年不重来，一日难再晨。及时宜自勉，岁月不待人!",
        "聪明人是快乐的，自以为聪明的才烦恼。帮助别人减轻三分烦恼，自己就会享受七分快乐。",
        "每个人都有潜在的能量，只是很容易被习惯所掩盖，被时间所迷离，被惰性所消磨。",
        "有理想在的地方，地狱就是天堂。有希望在的地方，痛苦也成欢乐。",
        "不要对挫折叹气，姑且把这一切看成是在你成大事之前，必须经受的准备工作。",
        "河流之所以能够到达目的地，是因为它懂得怎样避开障碍。",
        "一个成功的竞争者应该经得起风雨，应该具有抗挫折的能力。在竞争中流泪是弱者，只有在困境中奋起，才能成为强者。",
        "成功沒有捷径，历史上有成就的人，总是敢于行动，也会经常失败。不要让对失败的恐惧，绊住你尝试新事物的脚步。",
        "学会理解，因为只有理解别人，才会被别人理解。",
        "学会忘记，因为只有忘记已经失去的才能立足当前，展望未来。",
        "学会快乐，因为只有开心度过每一天，活得才精彩。",
        "心宽阔了，才能明白没有一个人是孤岛，才能欣赏到对岸的风景，才能懂得如何接纳他人。",
        "当困难来临时，用微笑去面对，用智慧去解决。",
        "没有人富有的可以不用别人的帮助，也没有人穷的不能在某方面给他人帮助。",
        "规划的根本目的是为了更快、更有效地达成目标。",
        "不要惧怕学习，知识是没有重量的，你永远可以轻易的带着它与你同行。",
        "别害怕承认你并非完美。正因如此，我们才得以藉由这脆弱的细丝紧密地串绑在一起。",
        "在你有一肚子火要发之前，先给自己钟沉思一会儿。",
        "收敛自己的脾气，偶尔要刻意沉默，因为冲动会做下让自己无法挽回的事情。",
        "试着重新开始吧，要知道，多抱怨一天，就少幸福一天，多回头看一天，就少前进一天。",
        "人生就像一张有去无回的单程车票，没有彩排，每一场都是现场直播。把握好每次演出便是对人生最好的珍惜。",
        "高傲自大只能让你止步不前，但是正直和谦虚可以引领你走向成功。",
        "要么你去驾驭生命，要么是生命驾驭你。你的心态决定谁是坐骑，谁是骑师。",
        "一般人会在困境面前浑身发抖，而成大事者则能把困境变为成功的有力跳板。",
        "成大事者的特点之一是：善于靠借力、借热去营造成功的局势，从而能把一件件难以办成的事办成，实现自己人生的规划。",
        "如果你想要更上一层楼，就为别人提供超出预期更多更好的服务。",
        "没有问题就是最大的问题。没有问题的安逸如同没有引爆的地雷一样危险。",
        "失败能打垮人的头脑，胜利也能冲昏人的头脑。",
        "天时不如地利，地利不如人和。",
        "人们经常抱怨天气不好，实际上并不是天气不好。只要自己有乐观自信的心情，天天都是好天气。",
        "一个人的目标是从梦想开始的，一个人的幸福是从心态上把握的，而一个人的成功则是在行动中实现的。因为只有行动，才是否滋润你成功的食物和泉水。",
    ]

    return random.choice(expressions)
